<html>
 <head>
  <meta charset="UTF-8">
 </head>
 <body>
  <h1 data-lake-id="tESb4" id="tESb4"><span data-lake-id="ue69a3a87" id="ue69a3a87">典型回答</span></h1>
  <p data-lake-id="u8bf6a386" id="u8bf6a386"><br></p>
  <p data-lake-id="uaa5883a8" id="uaa5883a8"><strong><span data-lake-id="u901f390a" id="u901f390a">Mock测试就是在测试过程中，对于某些不容易构造或者不容易获取的对象，用一个虚拟的对象来创建以便测试的测试方法。</span></strong></p>
  <p data-lake-id="u8e21d544" id="u8e21d544"><span data-lake-id="u3487450b" id="u3487450b">​</span><br></p>
  <p data-lake-id="udb748546" id="udb748546"><span data-lake-id="u0df61d49" id="u0df61d49">不仅仅是软件开发领域的单元测试，其实在很多工业测试场景中，也会使用一些Mock技术，比如常见的汽车碰撞测试。</span></p>
  <p data-lake-id="u2b50e499" id="u2b50e499"><br></p>
  <p data-lake-id="uf523fbce" id="uf523fbce"><span data-lake-id="ud2296308" id="ud2296308">汽车在上市之前都需要经过碰撞测试，并且公布测试结果。碰撞测试过程中需要通过真实撞击来评定汽车的耐撞能力以及对内部驾驶人员的保护能力。</span></p>
  <p data-lake-id="u275cefb5" id="u275cefb5"><br></p>
  <p data-lake-id="ue1a7230d" id="ue1a7230d"><span data-lake-id="uc214ab73" id="uc214ab73">但是，为了保证验证的准确性，有为了保证测试人员的安全，一般会采用假人来进行测试。这些假人都是经过特制的，他们的生物学性能一般和真人是一样的，比如体重、关节能力、组织强度等。</span></p>
  <p data-lake-id="u5168ba02" id="u5168ba02"><br></p>
  <p data-lake-id="u24fc02e0" id="u24fc02e0"><span data-lake-id="uee6cc6e7" id="uee6cc6e7">而且有时候，为了保证测试的全面性，还会采用各种各样的假人，如成年人、老人、小孩子、男性、女性等都需要充分测试到。</span></p>
  <p data-lake-id="u4f9ad545" id="u4f9ad545"><br></p>
  <p data-lake-id="u5790d327" id="u5790d327"><span data-lake-id="u74fe9e81" id="u74fe9e81">所以，这个假人其实就是一个</span><strong><span data-lake-id="uc564ef6e" id="uc564ef6e">Mock对象</span></strong><span data-lake-id="ub95af001" id="ub95af001">。在软件单元测试中，我们也需要用到这些测试对象。目的也类似，就是为了保证测试的全面性及准确性。</span></p>
  <p data-lake-id="u6219e86f" id="u6219e86f"><br></p>
  <p data-lake-id="u76f2bf93" id="u76f2bf93"><span data-lake-id="u8e8585aa" id="u8e8585aa">之所以要在测试中使用Mock对象，其实有很多原因，其中最重要的原因就是真实对象的构造成本太高。这时候一般就会采用mock对象。</span></p>
  <p data-lake-id="u23b53a35" id="u23b53a35"><br></p>
  <p data-lake-id="ua54f7b7b" id="ua54f7b7b"><span data-lake-id="u9b3835be" id="u9b3835be">而市面上也有很多工具可以方便的帮助我们进行单元测试的mock，如Easymock、jMock、Mockito、Unitils Mock、PowerMock、JMockit等。</span></p>
  <p data-lake-id="u8c56902d" id="u8c56902d"><br></p>
  <p data-lake-id="uf04ab0e9" id="uf04ab0e9"><span data-lake-id="u3f0f4e7a" id="u3f0f4e7a">其中比较常用的就是Easymock（</span><a href="https://easymock.org/" target="_blank" data-lake-id="uc284ad78" id="uc284ad78"><span data-lake-id="u2e6c7b21" id="u2e6c7b21">https://easymock.org/</span></a><span data-lake-id="ufbd4bbf0" id="ufbd4bbf0"> ）、JMockit（</span><a href="https://jmockit.github.io/index.html" target="_blank" data-lake-id="u6d5dcd72" id="u6d5dcd72"><span data-lake-id="uf82e617c" id="uf82e617c">https://jmockit.github.io/index.html</span></a><span data-lake-id="ube64ccf6" id="ube64ccf6"> ）和Mockito（</span><a href="https://site.mockito.org/" target="_blank" data-lake-id="ue3a58949" id="ue3a58949"><span data-lake-id="uff7c8947" id="uff7c8947">https://site.mockito.org/</span></a><span data-lake-id="udd89bd5f" id="udd89bd5f"> ）这三种，用起来都比较简单。</span></p>
  <p data-lake-id="ue5c5b6ef" id="ue5c5b6ef"><br></p>
  <p data-lake-id="u9122fe2b" id="u9122fe2b"><span data-lake-id="ua6748e7c" id="ua6748e7c">关于这些工具的对比，在JMockit官网中有一张图还是挺明显的，如下：</span></p>
  <p data-lake-id="u65b2072f" id="u65b2072f"><br></p>
  <p data-lake-id="u37b8952a" id="u37b8952a"><img src="https://cdn.nlark.com/yuque/0/2023/jpeg/5378072/1675140679876-3911c1c4-fbb4-4548-ab47-3fc40877fdd9.jpeg?x-oss-process=image%2Fwatermark%2Ctype_d3F5LW1pY3JvaGVp%2Csize_50%2Ctext_SmF2YSA4IEd1IFA%3D%2Ccolor_FFFFFF%2Cshadow_50%2Ct_80%2Cg_se%2Cx_10%2Cy_10"></p>
  <p data-lake-id="u73e23b02" id="u73e23b02"><br></p>
  <h1 data-lake-id="W27B6" id="W27B6"><span data-lake-id="u54c0025e" id="u54c0025e">扩展知识</span></h1>
  <h3 data-lake-id="fc851242" id="fc851242"><span data-lake-id="u0a617ac4" id="u0a617ac4">接口mock</span></h3>
  <p data-lake-id="u0ec516ff" id="u0ec516ff"><br></p>
  <p data-lake-id="u21ad5528" id="u21ad5528"><span data-lake-id="u5bd8706f" id="u5bd8706f">如我们的要测试的一个方法，其中依赖了一个RPC远程服务，因为远程服务的返回值可能是各种各样的，我们为了测试我们的接口的鲁棒性，就会针对各种边界情况进行充分测试。</span></p>
  <p data-lake-id="ufafc0187" id="ufafc0187"><br></p>
  <p data-lake-id="u4b897bdf" id="u4b897bdf"><span data-lake-id="uab57ae1c" id="uab57ae1c">如果把外部接口mock掉，也就是把外部接口的返回值当做一个mock对象，那么我们就可以很方便的模拟各种情况。如外部接口正常返回、异常返回、请求超时等等，都可以很方便的被测试。</span></p>
  <p data-lake-id="uc04fd7e7" id="uc04fd7e7"><br></p>
  <p data-lake-id="ub6bdc177" id="ub6bdc177"><span data-lake-id="u1ab5ae14" id="u1ab5ae14">其实，随着软件开发这么多年的发展，mock技术已经不仅仅局限于单元测试阶段了，尤其是随着微服务的兴起，应用拆分的越来越细，应用见依赖也越来越多。</span></p>
  <p data-lake-id="u7979f8c7" id="u7979f8c7"><br></p>
  <p data-lake-id="u39b07619" id="u39b07619"><span data-lake-id="uddafe32d" id="uddafe32d">这时候Mock技术就显得尤为重要了。</span></p>
  <p data-lake-id="u8ec95802" id="u8ec95802"><br></p>
  <p data-lake-id="u590804d5" id="u590804d5"><span data-lake-id="ub0403517" id="ub0403517">很多时候，一个项目中，大家可能是同时开发的，而我们的很多下游依赖可能还没开完完，或者有些特殊case没办法构造，那这时候就可以利用mock技术来mock掉下游接口。</span></p>
  <p data-lake-id="u5b42737d" id="u5b42737d"><br></p>
  <p data-lake-id="u85a5d14b" id="u85a5d14b"><span data-lake-id="ue601e7b1" id="ue601e7b1">我们日常开发中用到的时候很多，比如日常开发环境调用支付宝，我们需要经常构造诸如协议过期、余额不足、请求超时、账户不存在等case的时候，就可以想办法将他们的接口mock掉。</span></p>
  <p data-lake-id="uabc641b6" id="uabc641b6"><br></p>
  <p data-lake-id="u2ba3d198" id="u2ba3d198"><span data-lake-id="u8776c969" id="u8776c969">市面上现在也有很多接口mock工具可以使用，如RAP、Yapi、Moco和DOClever等。</span></p>
  <h4 data-lake-id="RAP" id="RAP"><span data-lake-id="ubee8ec8b" id="ubee8ec8b">RAP</span></h4>
  <p data-lake-id="u8db3551f" id="u8db3551f"><br></p>
  <p data-lake-id="ud0f52aa9" id="ud0f52aa9"><span data-lake-id="ud1ae3f43" id="ud1ae3f43">RAP是阿里团队出的一款接口管理工具，能给你提供方便的接口文档管理、Mock、导出等功能。他可以通过分析接口结构，动态生成模拟数据，校验真实接口正确性，围绕接口定义，通过一系列自动化工具提升我们的协作效率。</span></p>
  <p data-lake-id="u259b1b42" id="u259b1b42"><br></p>
  <p data-lake-id="u2b58c75d" id="u2b58c75d"><span data-lake-id="ua5107d66" id="ua5107d66">现在该项目已暂停维护，但是官方团队推出了RAP2，RAP2 是在 RAP1 基础上重做的新项目，项目地址：</span><a href="https://github.com/thx/rap2-delos" target="_blank" data-lake-id="uc60d4846" id="uc60d4846"><span data-lake-id="u1eddc03b" id="u1eddc03b">https://github.com/thx/rap2-delos</span></a></p>
  <p data-lake-id="u0f32338c" id="u0f32338c"><br></p>
  <p data-lake-id="u1d9a003e" id="u1d9a003e"><img src="http://www.hollischuang.com/wp-content/uploads/2020/12/16078497879943.jpg?x-oss-process=image%2Fwatermark%2Ctype_d3F5LW1pY3JvaGVp%2Csize_62%2Ctext_SmF2YSA4IEd1IFA%3D%2Ccolor_FFFFFF%2Cshadow_50%2Ct_80%2Cg_se%2Cx_10%2Cy_10"><span data-lake-id="u610ac481" id="u610ac481">​</span></p>
  <h4 data-lake-id="YApi" id="YApi"><span data-lake-id="u25977e60" id="u25977e60">YApi</span></h4>
  <p data-lake-id="u766dd64e" id="u766dd64e"><br></p>
  <p data-lake-id="u2fdc2140" id="u2fdc2140"><span data-lake-id="u2328fe7e" id="u2328fe7e">YApi是去哪儿网移动架构组开发的一个开源项目，旨在为开发、产品、测试人员提供更优雅的接口管理服务。可以帮助开发者轻松创建、发布、维护 API。官网地址：</span><a href="https://hellosean1025.github.io/yapi/" target="_blank" data-lake-id="uf503c24b" id="uf503c24b"><span data-lake-id="u105c5325" id="u105c5325">https://hellosean1025.github.io/yapi/</span></a></p>
  <p data-lake-id="u0a0800d2" id="u0a0800d2"><br></p>
  <p data-lake-id="u469087bc" id="u469087bc"><img src="http://www.hollischuang.com/wp-content/uploads/2020/12/16078499594983.jpg?x-oss-process=image%2Fwatermark%2Ctype_d3F5LW1pY3JvaGVp%2Csize_61%2Ctext_SmF2YSA4IEd1IFA%3D%2Ccolor_FFFFFF%2Cshadow_50%2Ct_80%2Cg_se%2Cx_10%2Cy_10"><span data-lake-id="ue3c10638" id="ue3c10638">​</span></p>
  <h4 data-lake-id="Moco" id="Moco"><span data-lake-id="u1b6fe344" id="u1b6fe344">Moco</span></h4>
  <p data-lake-id="u51127ab1" id="u51127ab1"><br></p>
  <p data-lake-id="ub4de3f37" id="ub4de3f37"><span data-lake-id="u84d5f5d5" id="u84d5f5d5">Moco 是一个搭建模拟服务器的工具，其支持 API 和独立运行两种方式，前者通常是在 junit 等测试框架中使用，后者则是通过运行一个 jar 包开启服务。项目地址：</span><a href="https://github.com/dreamhead/moco" target="_blank" data-lake-id="u5bdff87f" id="u5bdff87f"><span data-lake-id="u071c9183" id="u071c9183">https://github.com/dreamhead/moco</span></a></p>
  <p data-lake-id="u84fcfba6" id="u84fcfba6"><br></p>
  <h4 data-lake-id="DOClever" id="DOClever"><span data-lake-id="uc7764680" id="uc7764680">DOClever</span></h4>
  <p data-lake-id="u7ed34d77" id="u7ed34d77"><br></p>
  <p data-lake-id="uf480e4dd" id="uf480e4dd"><span data-lake-id="u5a4b3d40" id="u5a4b3d40">DOClever是一个可视化免费开源的接口管理工具 ,可以分析接口结构，校验接口正确性， 围绕接口定义文档，通过一系列自动化工具提升我们的协作效率。主要提供接口信息管理、接口调试运行、接口Mock、自动化测试、团队协作等功能。官网地址：</span><a href="http://doclever.cn/controller/index/index.html" target="_blank" data-lake-id="u6e247fce" id="u6e247fce"><span data-lake-id="ud8bc80cb" id="ud8bc80cb">http://doclever.cn/controller/index/index.html</span></a></p>
  <p data-lake-id="ubdc52091" id="ubdc52091"><br></p>
  <p data-lake-id="u53a6a461" id="u53a6a461"><img src="http://www.hollischuang.com/wp-content/uploads/2020/12/16078500933599-scaled.jpg?x-oss-process=image%2Fwatermark%2Ctype_d3F5LW1pY3JvaGVp%2Csize_73%2Ctext_SmF2YSA4IEd1IFA%3D%2Ccolor_FFFFFF%2Cshadow_50%2Ct_80%2Cg_se%2Cx_10%2Cy_10"></p>
 </body>
</html>